#ifndef _AES_H_
#define _AES_H_

#include <stdlib.h>
#include <stdint.h>
#include "ed_base.h"
#include "base64.h"
#include "mbedtls/aes.h"


#ifndef CBC
  #define CBC 1
#endif
#ifndef ECB
  #define ECB 2
#endif
#ifndef CFB128
  #define CFB128 3
#endif
#ifndef CTR
  #define CTR 4
#endif

#ifndef LOGE
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,"s",__VA_ARGS__)
#endif

static const unsigned  char HEX[16]={0x10,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};

//__attribute__((section (".mytext")))
//static const uint8_t AES_KEY[]="1234567890abcdef";



#if defined(ECB) && ECB

/***
 * ECB模式
 * @param mode MBEDTLS_AES_ENCRYPT或者MBEDTLS_AES_DECRYPT
 * @param input
 * @param key 只能为16位24位32位字符
 * @param output
 */
void AES_ECB_crypt(int mode, uint8_t* input, const uint8_t* key, uint8_t *output);
/***
 * CBC模式
 * @param mode MBEDTLS_AES_ENCRYPT或者MBEDTLS_AES_DECRYPT
 * @param input
 * @param iv 向量，至少为16位，传空或者不满16位补0
 * @param key 只能为16位24位32位字符
 * @param output
 */
void AES_CBC_crypt(int mode, uint8_t* input,  const uint8_t* iv, const uint8_t* key, uint8_t *output);

void AES_CFB128_crypt(uint8_t* input, const uint8_t* key, uint8_t *output);
void AES_CTR_crypt(uint8_t* input, const uint8_t* key, uint8_t *output);

/***
 * PKCS5Padding加密
 * @param type  ECB，CBC，CFB128，CTR
 * @param in
 * @param iv cbc加密模式下向量，至少为16位，传空或者不满16位补0
 * @param key key 只能为16位24位32位字符
 * @return
 */
char* AES_PKCS5Padding_Encrypt(int type, const char *in,const uint8_t* iv, const uint8_t *key);

//char* AES_CBC_PKCS5Padding_Encrypt(const char *in,const uint8_t *key);
//char* AES_CFB128_PKCS5Padding_Encrypt(const char *in,const uint8_t *key);
//char* AES_CTR_PKCS5Padding_Encrypt(const char *in,const uint8_t *key);

/***
 * PKCS5Padding解密
 * @param type  ECB，CBC，CFB128，CTR
 * @param in
 * @param iv cbc加密模式下向量，至少为16位，传空或者不满16位补0
 * @param key key 只能为16位24位32位字符
 * @return
 */
char* AES_PKCS5Padding_Decrypt(int type,const char *in, const uint8_t* iv, const uint8_t* key);

//char* AES_CBC_PKCS5Padding_Decrypt(const char *in, const uint8_t* key);
//char* AES_CFB128_PKCS5Padding_Decrypt(const char *in, const uint8_t* key);
//char* AES_CTR_PKCS5Padding_Decrypt(const char *in, const uint8_t* key);

int* findPaddingIndex(uint8_t * str,size_t length);

#endif // #if defined(ECB) && ECB


/*
 * CBC是向量模式  暂不采用
 如果需要使用 ，请移步 https://github.com/kokke/tiny-AES128-C
 
#if defined(CBC) && CBC

#endif // #if defined(CBC) && CBC

*/
#endif //_AES_H_
